package controllers

import (
	"log"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/gorilla/websocket"
)

type ChatController struct {
}

// StreamChat 流式输出聊天信息
//
//	@Summary		流式输出聊
//	@Summary		流式输出聊天信息
//	@Description	流式输出聊天信息，客户端可以实时接收数据。
//	@Tags			Chat
//	@Accept			json
//	@Produce		text/event-stream
//	@Success		200	{string}	string	"data: 1\n\n"
//	@Router			/web/StreamChat [get]
func (u ChatController) StreamChat(c *gin.Context) {
	// 设置响应头，指定内容类型为流式输出
	c.Writer.Header().Set("Content-Type", "text/event-stream")
	c.Writer.Header().Set("Cache-Control", "no-cache")
	c.Writer.Header().Set("Connection", "keep-alive")
	c.Writer.Header().Set("Access-Control-Allow-Origin", "*")

	// 循环输出 1 到 100 的数字
	for i := 1; i <= 5; i++ {

		// 发送数据
		c.Writer.Write([]byte("data: " + string(time.Now().Format("2006-01-02 15:04:05")) + "\n\n"))
		// 刷新缓冲区，将数据发送给客户端
		c.Writer.(http.Flusher).Flush()
		// 每隔 1 秒输出一个数字
		time.Sleep(time.Second)
	}

}

// 定义 WebSocket 升级器
var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

// WsHandler 处理 WebSocket 连接请求
//
//	@Summary		处理 WebSocket 连接请求
//	@Description	处理 WebSocket 连接请求，客户端可以实时接收和发送数据。
//	@Tags			Chat
//	@Accept			json
//	@Produce		text/event-stream
//	@Success		200	{string}	string	"data: 1\n\n"
//	@Router			/web/WsHandler [get]
func (u ChatController) WsHandler(c *gin.Context) {
	// 升级 HTTP 连接为 WebSocket 连接
	//ws://localhost:8080/v2/web/WsHandler
	conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	if err != nil {
		log.Println("WebSocket 升级失败:", err)
		return
	}
	defer conn.Close()

	for {
		// 读取消息
		messageType, p, err := conn.ReadMessage()
		log.Println("客户端发送消息:", string(p))
		if err != nil {
			log.Println("读取消息失败:", err)
			break
		}
		// 回显消息
		err = conn.WriteMessage(messageType, p)
		if err != nil {
			log.Println("写入消息失败:", err)
			break
		}
	}
}
